# coding:utf8

from typing import List

from openai import OpenAI
from utils.llm.prompt import PROMPT_TEMPLATE
from utils.llm.base_model import BaseModel

class DeepSeekModel(BaseModel):
    """
    基于 DeepSeek 模型的对话类，继承自 BaseModel。
    主要用于通过 DeepSeek API 来生成对话回答。
    """
    def __init__(self, api_key: str = "sk-aee7c971cb3d47f795ae76e8fc56e075", 
                 base_url: str = "https://api.deepseek.com/v1") -> None:
        """
        初始化 DeepSeek 模型。
        :param api_key: DeepSeek API 的密钥
        :param base_url: 用于访问 DeepSeek API 的基础 URL，默认为代理 URL
        """
        super().__init__()
        self.client = OpenAI(api_key=api_key, base_url=base_url)

    def chat(self, prompt: str, history: List = [], content: str = '') -> str:
        """
        使用 DeepSeek 生成回答。
        :param prompt: 用户的提问
        :param history: 之前的对话历史（可选）
        :param content: 可参考的上下文信息（可选）
        :return: 生成的回答
        """
        # 构建包含问题和上下文的完整提示
        full_prompt = PROMPT_TEMPLATE['DEEPSEEK_PROMPT_TEMPLATE'].format(question=prompt, context=content)

        try:
            # 调用 DeepSeek 模型进行推理
            # deepseek-chat 和 deepseek-reasoner 都已经升级为 DeepSeek-V3.1。
            # deepseek-chat 对应 DeepSeek-V3.1 的非思考模式，deepseek-reasoner 对应 DeepSeek-V3.1 的思考模式.
            response = self.client.chat.completions.create(
                model="deepseek-chat",
                messages=[
                    {"role": "user", "content": full_prompt}
                ]
            )

            # 返回模型生成的第一个回答
            return response.choices[0].message.content
        except Exception as ex:
            print(f"DeepSeek API Error: {ex}")
            return ''